home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1993 July / InfoMagic USENET CD-ROM July 1993.ISO / sources / unix / volume10 / notes-mod.pch < prev    next >
Encoding:
Internet Message Format  |  1987-07-29  |  39.1 KB

  1. Path: uunet!rs
  2. From: rs@uunet.UU.NET (Rich Salz)
  3. Newsgroups: comp.sources.unix
  4. Subject: v10i071:  Patches for NOTESFILES for moderated groups
  5. Message-ID: <736@uunet.UU.NET>
  6. Date: 30 Jul 87 22:24:19 GMT
  7. Organization: UUNET Communications Services, Arlington, VA
  8. Lines: 1316
  9. Approved: rs@uunet.UU.NET
  10.  
  11. Submitted-by: Paul Pomes (CSO, UofIll 217-333-6262) <paul@uxc.cso.uiuc.edu>
  12. Posting-number: Volume 10, Issue 71
  13. Archive-name: notes-mod.pch
  14.  
  15. [  If you run NOTES, then you want to install these patches.  They
  16.    turn posting to moderated groups into mail messages to the
  17.    moderator, provide .signature files, and -- wow! -- it's all
  18.    documented.  --r$  ]
  19.  
  20. The following is an improvement on Rich Salz's notesfile changes that
  21. supported moderated newsgroups/notesfiles.  More details are in the 
  22. README2 file.
  23.  
  24.          Paul Pomes
  25.  
  26. UUCP:     {ihnp4,seismo}!uiucuxc!paul
  27. Internet: paul@uxc.cso.uiuc.edu   BITNET: paul@uiucuxc
  28. MILNET:   paul@uiucuxc.arpa       CSNET:  paul%uxc@uiuc.csnet
  29. US Mail:  UofIllinois, CSO, MC-256, 1304 W Springfield Ave, Urbana, IL  61801
  30.  
  31. #! /bin/sh
  32. # This is a shell archive, meaning:
  33. # 1. Remove everything above the #! /bin/sh line.
  34. # 2. Save the resulting text in a file.
  35. # 3. Execute the file with /bin/sh (not csh) to create:
  36. #    README2
  37. #    diffs.doc
  38. #    diffs.man
  39. #    diffs.src
  40. #    moderators
  41. # This archive created: Wed Jul  1 16:49:52 1987
  42. export PATH; PATH=/bin:/usr/bin:$PATH
  43. if test -f 'README2'
  44. then
  45.     echo shar: "will not over-write existing file 'README2'"
  46. else
  47. cat << \SHAR_EOF > 'README2'
  48. Written  7:27 am  Aug 22, 1985 by sources-request@panda in comp.sources.unix
  49.     Note title: changes to notes
  50.  
  51. Mod.sources:  Volume 2, Issue 36
  52. Submitted by: genrad!mit-eddie!mirror!rs (Rich Salz)
  53.  
  54. This note contains modifications to the latest version of notes, 1.7.
  55.  
  56. The diffs listed below will modify notes (version 1.7, at least) to
  57. understand moderated newsgroups, as well as "local" notesfiles.
  58.  
  59. In a MODERATED notesfile, any attempt to write a note or send mail
  60. is turned into a call that sends mail to the moderator.  For example,
  61. is the MODERATED flag is on for net.announce, any attempt to post
  62. their will instead be sent as mail to mark@cbosgd.att (or whatever).
  63. Note that it is still possible to "Copy" a note into a MODERATED
  64. notesfile.  This can be prohibited by (a) turning off write permission
  65. on the all MODERATED notesfiles, or (b) added some trivial code to
  66. adnote.c.  I did (a); if anyone wants the code for (b), let me know.
  67.  
  68. The mapping of notesfile names to moderators is done in a file
  69. named "moderators" in the notesfile utility directory (default is
  70. /usr/spool/notes/.utilities).  This file contains lines like:
  71.     notesfile_name <spaces_or_tabs> mail_address
  72. Blank lines, or lines starting with '#', are ignored.  Here are
  73. a couple of lines from my "moderators" file:
  74.  
  75. Here are a couple of lines from my .utilties/moderator file:
  76. # This comes from the posting by Gene Spafford
  77. # Correct addresses for mirror systems by R$, 19aug85.
  78. mod.map        wjh12!ihnp4!cbosgd!mark
  79. mod.map.uucp    wjh12!ihnp4!cbosgd!uucpmap
  80. # Here's handling an ARPA gateway'd list
  81. fa.laser-lover        furuta%washington@cca
  82.  
  83. # Here's one that we gateway ourselves
  84. ms.loops        loops-users%berkeley@cca
  85. # Any valid address is ok
  86. ms.prisoner        inmet!masscomp!allegra!sjuvax!ianucci
  87.  
  88. Enough talk, here are the diffs.
  89. NOTE:  THE RCS REVISIONS SHOW ARE WRONG.  I BLEW IT!
  90.  
  91. =======================================================================
  92.  
  93. By Paul Pomes, CSO, Univ of Illinois (paul@uxc.cso.uiuc.edu)
  94. Wed Jul  1 14:02:47 CDT 1987
  95.  
  96. I've applied Rich's changes to the latest edition of notes from the UofI
  97. CS Dept.  A few changes were made:
  98.  
  99.   The M,m keys in a moderated notesfile can send mail to arbitrary
  100.   addresses.  Previously mail went only to the moderator.
  101.  
  102.   A new note/response must be a non-zero size before the user is prompted
  103.   for a signature file.
  104.  
  105.   The nfadmin program has two new flags, M and L, for setting the 
  106.   moderated and local bits in a notesfile.
  107.  
  108.   The notes.1 and nfadmin.8 man pages have been updated to mention the
  109.   new NFSIG environment variable, and the behavior of local/moderated
  110.   notesfiles.
  111.  
  112.   The Notesfile Reference manual has been updated as well.
  113.  
  114. A complete distribution of the virgin sources, plus the RCS recorded changes,
  115. is available for anonymous FTP from uxc.cso.uiuc.edu:pub/Notes.tar.Z .
  116.  
  117. SHAR_EOF
  118. fi
  119. if test -f 'diffs.doc'
  120. then
  121.     echo shar: "will not over-write existing file 'diffs.doc'"
  122. else
  123. cat << \SHAR_EOF > 'diffs.doc'
  124. *** 2.1.old        Wed Jul  1 16:23:05 1987
  125. --- 2.1            Wed Jul  1 16:23:14 1987
  126. ***************
  127. *** 268,274 ****
  128.   .ix
  129.   Read the policy note.
  130.   .ix
  131. ! Check on anonymous and networked status.
  132.   .ix
  133.   Register a complaint/suggestion about notesfiles.
  134.   .ix
  135. --- 268,274 ----
  136.   .ix
  137.   Read the policy note.
  138.   .ix
  139. ! Check on anonymous, networked, local, and moderated status.
  140.   .ix
  141.   Register a complaint/suggestion about notesfiles.
  142.   .ix
  143. ***************
  144. *** 522,534 ****
  145.   After the prompt,
  146.   type the insert command along with the text you wish to enter.
  147.   Write the text to the disk and leave the editor.  The system will prompt
  148. ! you for various options if they are available:  anonymity, director
  149. ! message status, and the note's title.
  150.   
  151.       To write a response to a note type ``w'' while that note or any of
  152.   its responses is displayed. 
  153.   The same steps used to write a base note
  154.   should then be followed.
  155.   
  156.   .ss "Mailing Notesfile Text"
  157.   
  158. --- 522,549 ----
  159.   After the prompt,
  160.   type the insert command along with the text you wish to enter.
  161.   Write the text to the disk and leave the editor.  The system will prompt
  162. ! you for various options if they are available:  signature block, anonymity,
  163. ! director message status, and the note's title.
  164.   
  165.       To write a response to a note type ``w'' while that note or any of
  166.   its responses is displayed. 
  167.   The same steps used to write a base note
  168.   should then be followed.
  169. +     In the case of moderated notesfiles where submissions should be
  170. + sent to the notesfile topic administrator, the behavior of ``w'' is
  171. + changed slightly.
  172. + When writing a new note the notesfile system will prompt to
  173. + say, ``Moderated, send mail to moderator?''
  174. + A response of ``y'' will invoke the mail program with the To: line set
  175. + to the moderator's name.
  176. + The text entered will not be entered into the notesfile.
  177. + Instead a mail message with the text is sent to the topic administrator.
  178. + He or she will check the submission for appropriateness, then insert it
  179. + into the notesfile for distribution.
  180. + Writing a response in a moderated notesfile invokes the mail program without
  181. + prompting.
  182.   
  183.   .ss "Mailing Notesfile Text"
  184.   
  185. *** 2.2.old        Wed Jul  1 16:23:51 1987
  186. --- 2.2            Wed Jul  1 16:23:54 1987
  187. ***************
  188. *** 321,326 ****
  189. --- 321,334 ----
  190.   If unspecified, the system uses a standard set which usually includes
  191.   ``general'' and ``net.general''.
  192.   .ix
  193. + ``NFSIG'' specifies the file name containing a signature block to be included
  194. + at the end of a note or response.
  195. + If this variable is set, notes will prompt whether to include this file
  196. + when the user writes a new note or response.
  197. + The signature block typically contains the user's name and various mail paths
  198. + back to him or her.
  199. + It should be kept small and concise.
  200. + .ix
  201.   ``PAGER'' is the paging program (``more'', ``pg'') which is used for scrolling
  202.   the help files.
  203.   The default paging program is /usr/ucb/more.
  204. *** 3.1.old        Wed Jul  1 16:24:09 1987
  205. --- 3.1            Wed Jul  1 16:24:11 1987
  206. ***************
  207. *** 28,33 ****
  208. --- 28,35 ----
  209.   .ix
  210.   Allow the notesfile to be networked.
  211.   .ix
  212. + Toggle the notesfile's moderated and local flags.
  213. + .ix
  214.   Permit or restrict anonymous notes.
  215.   .ix
  216.   Compress the notesfile.
  217. ***************
  218. *** 56,61 ****
  219. --- 58,65 ----
  220.   (o) Notesfile:   OPEN    Next note in slot: 1
  221.   (n) Networked:   YES    Deleted Notes (holes): 0  
  222.   (A) Is Archive:  NO    Deleted Responses (holes): 0  
  223. + (M) Moderated:   YES
  224. + (L) Local:       NO
  225.   (e) Expiration Threshold: Default
  226.   (E) Expiration Action:    ARCHIVE
  227.   (D) Archive with Dirmsg:  NOCARE   
  228. ***************
  229. *** 78,83 ****
  230. --- 82,88 ----
  231.   
  232.       Options available on this page include:  access lists, policy
  233.   note writing, title & director messages, open/close notesfile,
  234. + moderated & local notesfiles,
  235.   network enabling, anonymous notes, notesfile compress, and delete
  236.   a list of notes.
  237.   
  238. ***************
  239. *** 194,199 ****
  240. --- 199,220 ----
  241.   Arrangements must be made with the notesfile system ``owner'' to do the network
  242.   transfers.
  243.   
  244. + .ss "Moderated Notesfiles"
  245. +     Type ``M'' (``moderated'') to toggle whether a notesfile is moderated
  246. + or not.
  247. + Moderated notesfiles do not allow direct submissions.
  248. + Instead the text entered with a ``w'' command is enclosed in a mail message
  249. + and sent to the topic moderator.
  250. + A list of notesfiles and moderator mail addresses is kept in ~notes/moderators.
  251. + .ss "Local Notes"
  252. +     Type ``L'' (``local'') to toggle whether the notesfile is local
  253. + to the site.
  254. + Local notesfiles don't prompt to include signature files if the NFSIG
  255. + environment variable is set.
  256.   .ss "Anonymous Notes"
  257.   
  258.       Type ``a'' (``anonymous'') to toggle the availability of
  259. ***************
  260. *** 599,602 ****
  261. --- 620,635 ----
  262.   
  263.       Mapping is performed by the transmission program ``nfxmit''.
  264.   The ``nfrcv'' program does not consult this table.
  265. + .ss "Moderated Notesfiles"
  266. +     Moderated notesfiles don't allow direct submission of new notes
  267. + or responses.
  268. + The text entered by a user after a ``w'' command is collected by the mail
  269. + program of choice and sent to the topic moderator.
  270. + A list of notesfile names and moderator mail addresses is kept in the
  271. + file /usr/spool/notes/.utilities/moderators.
  272. + Each line of the file has a notesfile name, white space (tabs or blanks),
  273. + then the mail address of the moderator.
  274. + Any text following a ``#'' is considered a comment.
  275.   
  276. SHAR_EOF
  277. fi
  278. if test -f 'diffs.man'
  279. then
  280.     echo shar: "will not over-write existing file 'diffs.man'"
  281. else
  282. cat << \SHAR_EOF > 'diffs.man'
  283. *** notes.1.old        Wed Jun 24 14:02:30 1987
  284. --- notes.1        Wed Jun 24 14:02:32 1987
  285. ***************
  286. *** 195,200 ****
  287. --- 195,207 ----
  288.   allowing users to use different editors for writing notes and
  289.   for other tools.
  290.   .PP
  291. + Notes and responses to non-local notesfiles will include the file named
  292. + in the
  293. + .I NFSIG
  294. + variable as a signature block.
  295. + .I Notes
  296. + will prompt whether to include it when a new note or response is posted.
  297. + .PP
  298.   Some commonly used commands within the notesfile system are listed below:
  299.   .TP 10
  300.   space
  301. *** nfadmin.8.old    Wed Jun 24 14:02:47 1987
  302. --- nfadmin.8        Wed Jun 24 14:02:48 1987
  303. ***************
  304. *** 47,52 ****
  305. --- 47,70 ----
  306.   Flag this notesfile as a non-archive notesfile.  This does not affect what
  307.   happens to notes when they expire.
  308.   .TP
  309. + -M+
  310. + Flag this notesfile as a moderated notesfile.  This causes commands that
  311. + create new notes or responses to create a mail message to the newsgroup
  312. + moderator instead.  A list of notesfiles and the mail address of the
  313. + moderator is maintained in /usr/spool/notes/.utilities/moderators.
  314. + .TP
  315. + -M-
  316. + Flag this notesfile as a non-moderated notesfile.
  317. + .TP
  318. + -L+
  319. + Flag this notesfile as a local notesfile.  Local notesfiles don't ask
  320. + whether to include a .signature file at the end of a new note or response.
  321. + .TP
  322. + -L-
  323. + Flag this notesfile as a non-local notesfile.  If the NFSIG environment
  324. + variable is set, notes will prompt whether or not to include the signature
  325. + file named by NFSIG at the end of a new note or response.
  326. + .TP
  327.   -e=NN
  328.   Set the expiration time of this notesfile to NN days.  (NN should be replaced
  329.   with a positive number).
  330. SHAR_EOF
  331. fi
  332. if test -f 'diffs.src'
  333. then
  334.     echo shar: "will not over-write existing file 'diffs.src'"
  335. else
  336. cat << \SHAR_EOF > 'diffs.src'
  337. *** /tmp/,RCSt1020325    Wed Jul  1 13:38:12 1987
  338. --- Makefile    Wed Jul  1 13:10:53 1987
  339. ***************
  340. *** 10,22 ****
  341.   #    217-333-7937
  342.   #
  343.   
  344. ! BIN = /usr/local
  345.   MSTDIR = /usr/spool/notes
  346.   ARCHDIR = /usr/spool/oldnotes
  347.   NET = /usr/bin
  348.   AUTOSEQ = autoseq
  349.   NOTES = notes
  350. ! NOTESUID = 10
  351.   NOTESGRP = notes
  352.   ANON = anon
  353.   ANONUID = 4
  354. --- 10,22 ----
  355.   #    217-333-7937
  356.   #
  357.   
  358. ! BIN = /usr/local/bin
  359.   MSTDIR = /usr/spool/notes
  360.   ARCHDIR = /usr/spool/oldnotes
  361.   NET = /usr/bin
  362.   AUTOSEQ = autoseq
  363.   NOTES = notes
  364. ! NOTESUID = 24
  365.   NOTESGRP = notes
  366.   ANON = anon
  367.   ANONUID = 4
  368. ***************
  369. *** 124,130 ****
  370.         pattern.o perms.o recsio.o startup.o expand.o
  371.   NFTIMESTAMP = check.o cursor.o datein.o gname.o gtime.o misc.o miscio.o \
  372.         pattern.o permit.o recsio.o startup.o times.o expand.o \
  373. !       getdate.o perms.o ftime.o
  374.   NFXMIT    = check.o cursor.o dmpnote.o dmpresp.o getnet.o gname.o \
  375.         gtime.o lrsp.o misc.o miscio.o next.o nfalias.o nfsend.o \
  376.         pageout.o pattern.o permit.o perms.o recsio.o \
  377. --- 124,130 ----
  378.         pattern.o perms.o recsio.o startup.o expand.o
  379.   NFTIMESTAMP = check.o cursor.o datein.o gname.o gtime.o misc.o miscio.o \
  380.         pattern.o permit.o recsio.o startup.o times.o expand.o \
  381. !       getdate.o perms.o
  382.   NFXMIT    = check.o cursor.o dmpnote.o dmpresp.o getnet.o gname.o \
  383.         gtime.o lrsp.o misc.o miscio.o next.o nfalias.o nfsend.o \
  384.         pageout.o pattern.o permit.o perms.o recsio.o \
  385. ***************
  386. *** 216,224 ****
  387.       -chgrp $(NOTESGRP) $(UTILITY)/coredump
  388.   #    generate the available notesfile file here - only once!
  389.       echo "available notesfiles" > $(UTILITY)/avail.notes
  390.       touch $(UTILITY)/Dflt-Seq
  391. !     -chown $(NOTES) $(UTILITY)/avail.notes $(UTILITY)/Dflt-Seq
  392. !     -chgrp $(NOTESGRP) $(UTILITY)/avail.notes $(UTILITY)/Dflt-Seq
  393.       chmod 664 $(UTILITY)/avail.notes $(UTILITY)/Dflt-Seq
  394.       touch spool
  395.       @echo Notesfile Spool directories ready
  396. --- 216,225 ----
  397.       -chgrp $(NOTESGRP) $(UTILITY)/coredump
  398.   #    generate the available notesfile file here - only once!
  399.       echo "available notesfiles" > $(UTILITY)/avail.notes
  400. +     cp moderators $(UTILITY)/moderators
  401.       touch $(UTILITY)/Dflt-Seq
  402. !     -chown $(NOTES) $(UTILITY)/moderators $(UTILITY)/avail.notes $(UTILITY)/Dflt-Seq
  403. !     -chgrp $(NOTESGRP) $(UTILITY)/moderators $(UTILITY)/avail.notes $(UTILITY)/Dflt-Seq
  404.       chmod 664 $(UTILITY)/avail.notes $(UTILITY)/Dflt-Seq
  405.       touch spool
  406.       @echo Notesfile Spool directories ready
  407. *** /tmp/,RCSt1020338    Wed Jul  1 13:38:22 1987
  408. --- dropt.c    Wed Jul  1 12:54:59 1987
  409. ***************
  410. *** 24,29 ****
  411. --- 24,31 ----
  412.    *         -4 if the user hit cntrl d ( to total exit)
  413.    *
  414.    *    original author/outliner : Ray Essick may 29, 1981
  415. +  *      added the "moderated" flag:Rich $alz  aug 19, 1985
  416. +  *      added "local" flag, toggle, YorN:    Rich $alz  aug 19, 1985
  417.    *
  418.    */
  419.   
  420. ***************
  421. *** 35,43 ****
  422.               netrow,                    /* networked */
  423.               expirerow,                    /* expire age */
  424.               longrow,                    /* longest ok text */
  425. !             worksetrow;                    /* working set */
  426.   static int  lastrow;
  427.   
  428.   direct (io) struct io_f *io;
  429.   {
  430.       int     i;                        /* scratch */
  431. --- 37,51 ----
  432.               netrow,                    /* networked */
  433.               expirerow,                    /* expire age */
  434.               longrow,                    /* longest ok text */
  435. !             worksetrow,                    /* working set */
  436. !         modrow,                    /* moderated flag */
  437. !         localrow;                    /* local flag */
  438.   static int  lastrow;
  439.   
  440. + #define YorN(c)        ((c) != 0 ? YES : NO)
  441. + static char YES[] = "YES";
  442. + static char NO[] = "NO ";
  443.   direct (io) struct io_f *io;
  444.   {
  445.       int     i;                        /* scratch */
  446. ***************
  447. *** 113,143 ****
  448.           break;                    /* skipt out of the loop */
  449.   
  450.           case 'a':                     /* toggle anonymous option */
  451. !         locknf (io, DSCRLOCK);            /* lock the thing for a minute */
  452. !         getdscr (io, &io -> descr);        /* get up to date descriptor */
  453. !         if (io -> descr.d_stat & ANONOK)
  454. !             io -> descr.d_stat &= NOT ANONOK;
  455. !         else
  456. !             io -> descr.d_stat |= ANONOK;
  457. !         putdscr (io, &io -> descr);
  458. !         unlocknf (io, DSCRLOCK);
  459. !         at (anonrow, 18);
  460. !         printf (io -> descr.d_stat & ANONOK ? "ON " : "OFF");
  461. !         redraw = 0;
  462.           break;
  463.   
  464.           case 'A':                     /* Archive option */
  465. !         locknf (io, DSCRLOCK);            /* lock the thing for a minute */
  466. !         getdscr (io, &io -> descr);        /* get up to date descriptor */
  467. !         if (io -> descr.d_stat & ISARCH)
  468. !             io -> descr.d_stat &= NOT ISARCH;
  469. !         else
  470. !             io -> descr.d_stat |= ISARCH;
  471. !         putdscr (io, &io -> descr);
  472. !         unlocknf (io, DSCRLOCK);
  473. !         at (archrow, 18);
  474. !         printf (io -> descr.d_stat & ISARCH ? "YES" : "NO ");
  475. !         redraw = 0;
  476.           break;
  477.   
  478.           case 'l':                     /* message length */
  479. --- 121,131 ----
  480.           break;                    /* skipt out of the loop */
  481.   
  482.           case 'a':                     /* toggle anonymous option */
  483. !         toggle(io, ANONOK, anonrow);
  484.           break;
  485.   
  486.           case 'A':                     /* Archive option */
  487. !         toggle(io, ISARCH, archrow);
  488.           break;
  489.   
  490.           case 'l':                     /* message length */
  491. ***************
  492. *** 173,183 ****
  493.           unlocknf (io, DSCRLOCK);        /* all done ... */
  494.           at (longrow, 27);
  495.           printf ("%ld bytes   ", io -> descr.d_longnote);
  496. -         redraw = 0;
  497.           break;
  498.   
  499.           case 'c':                     /* compress the notefile */
  500. -         redraw = 0;
  501.           if (io -> descr.d_stat & OPEN)
  502.           {
  503.               at (lastrow, 10);
  504. --- 161,169 ----
  505. ***************
  506. *** 265,271 ****
  507.               printf ("%ld days     ", io -> descr.d_archtime);
  508.               break;
  509.           }
  510. -         redraw = 0;
  511.           break;
  512.   
  513.           case 'W':                     /* working Set size */
  514. --- 251,256 ----
  515. ***************
  516. *** 311,317 ****
  517.               default: 
  518.               printf ("%ld Notes    ", io -> descr.d_workset);
  519.           }
  520. -         redraw = 0;
  521.           break;
  522.   
  523.           case 'E':                     /* keep/delete/default */
  524. --- 296,301 ----
  525. ***************
  526. *** 348,354 ****
  527.               printf ("UNKNOWN");
  528.               break;
  529.           }
  530. -         redraw = 0;
  531.           break;
  532.   
  533.           case 'D':                     /* Archive dirmsg */
  534. --- 332,337 ----
  535. ***************
  536. *** 397,435 ****
  537.               printf ("UNKNOWN  ");
  538.               break;
  539.           }
  540. -         redraw = 0;
  541.           break;
  542.   
  543.           case 'o':                     /* toggle open status */
  544. !         locknf (io, DSCRLOCK);
  545. !         getdscr (io, &io -> descr);
  546. !         if (io -> descr.d_stat & OPEN)
  547. !             io -> descr.d_stat &= NOT OPEN;
  548. !         else
  549. !             io -> descr.d_stat |= OPEN;
  550. !         putdscr (io, &io -> descr);
  551. !         unlocknf (io, DSCRLOCK);
  552. !         at (openrow, 18);
  553. !         printf (io -> descr.d_stat & OPEN ? "OPEN  " : "CLOSED");
  554. !         redraw = 0;
  555.           break;
  556.   
  557.           case 'n':                     /* toggle network status */
  558. !         locknf (io, DSCRLOCK);
  559. !         getdscr (io, &io -> descr);
  560. !         if (io -> descr.d_stat & NETWRKD)
  561. !         {
  562. !             io -> descr.d_stat &= NOT NETWRKD;
  563. !         }
  564. !         else
  565. !         {
  566. !             io -> descr.d_stat |= NETWRKD;
  567. !         }
  568. !         putdscr (io, &io -> descr);
  569. !         unlocknf (io, DSCRLOCK);
  570. !         at (netrow, 18);
  571. !         printf (io -> descr.d_stat & NETWRKD ? "YES" : "NO ");
  572. !         redraw = 0;
  573.           break;
  574.   
  575.   
  576. --- 380,401 ----
  577.               printf ("UNKNOWN  ");
  578.               break;
  579.           }
  580.           break;
  581.   
  582.           case 'o':                     /* toggle open status */
  583. !         toggle (io, OPEN, openrow);
  584.           break;
  585.   
  586. +         case 'M':                     /* toggle moderated status */
  587. +         toggle (io, MODERATED, modrow);
  588. +         break;
  589. +         case 'L':                     /* toggle local status */
  590. +         toggle(io, LOCAL, localrow);
  591. +         break;
  592.           case 'n':                     /* toggle network status */
  593. !         toggle(io, NETWRKD, netrow);
  594.           break;
  595.   
  596.   
  597. ***************
  598. *** 530,536 ****
  599.   
  600.           default: 
  601.           printf ("\07");
  602. -         redraw = 0;
  603.           goto getkey;                /* hit a bad key */
  604.   
  605.       }
  606. --- 496,501 ----
  607. ***************
  608. *** 559,568 ****
  609.       printf (io -> descr.d_stat & OPEN ? "OPEN  " : "CLOSED");
  610.       at (netrow = atrow++, atcol);
  611.       printf ("(n) Networked:   ");            /* at(5,18); */
  612. !     printf (io -> descr.d_stat & NETWRKD ? "YES" : "NO ");
  613.       at (archrow = atrow++, atcol);
  614.       printf ("(A) Is Archive:  ");            /* at(6,18); */
  615. !     printf (io -> descr.d_stat & ISARCH ? "YES" : "NO");
  616.       at (expirerow = atrow++, atcol);
  617.       printf ("(e) Expiration Threshold: ");        /* at (6,27); */
  618.       switch ((int) (io -> descr.d_archtime))
  619. --- 524,539 ----
  620.       printf (io -> descr.d_stat & OPEN ? "OPEN  " : "CLOSED");
  621.       at (netrow = atrow++, atcol);
  622.       printf ("(n) Networked:   ");            /* at(5,18); */
  623. !     printf (YorN(io -> descr.d_stat & NETWRKD));
  624.       at (archrow = atrow++, atcol);
  625.       printf ("(A) Is Archive:  ");            /* at(6,18); */
  626. !     printf (YorN(io -> descr.d_stat & ISARCH));
  627. !     at (modrow = atrow++, atcol);
  628. !     printf ("(M) Moderated:   ");
  629. !     printf (YorN(io -> descr.d_stat & MODERATED));
  630. !     at (localrow = atrow++, atcol);
  631. !     printf ("(L) Local:       ");
  632. !     printf (YorN(io -> descr.d_stat & LOCAL));
  633.       at (expirerow = atrow++, atcol);
  634.       printf ("(e) Expiration Threshold: ");        /* at (6,27); */
  635.       switch ((int) (io -> descr.d_archtime))
  636. ***************
  637. *** 640,646 ****
  638.       atrow = 4;
  639.       atcol = 40;
  640.       at (atrow++, atcol);
  641. !     printf ("Policy Note Exists: %s", io -> descr.d_plcy ? "YES" : "NO");
  642.       at (atrow++, atcol);
  643.       printf ("Next note in slot: %d", io -> descr.d_nnote + 1);
  644.       at (atrow++, atcol);
  645. --- 611,617 ----
  646.       atrow = 4;
  647.       atcol = 40;
  648.       at (atrow++, atcol);
  649. !     printf ("Policy Note Exists: %s", YorN(io -> descr.d_plcy));
  650.       at (atrow++, atcol);
  651.       printf ("Next note in slot: %d", io -> descr.d_nnote + 1);
  652.       at (atrow++, atcol);
  653. ***************
  654. *** 655,658 ****
  655. --- 626,646 ----
  656.       if (atrow > lastrow)
  657.       lastrow = atrow;
  658.       lastrow++;
  659. + }
  660. + toggle(io, flag, row)
  661. +     struct io_f *io;
  662. +     int flag;
  663. +     int row;
  664. + {
  665. +     locknf (io, DSCRLOCK);
  666. +     getdscr (io, &io -> descr);
  667. +     if (io -> descr.d_stat & flag)
  668. +     io -> descr.d_stat &= NOT flag;
  669. +     else
  670. +     io -> descr.d_stat |= flag;
  671. +     putdscr (io, &io -> descr);
  672. +     unlocknf (io, DSCRLOCK);
  673. +     at (row, 18);
  674. +     printf (YorN(io -> descr.d_stat & flag));
  675.   }
  676. *** /tmp/,RCSt1020349    Wed Jul  1 13:38:31 1987
  677. --- gtext.c    Wed Jul  1 12:56:31 1987
  678. ***************
  679. *** 1,5 ****
  680. --- 1,7 ----
  681.   #include "parms.h"
  682.   #include "structs.h"
  683. + #include <sys/types.h>
  684. + #include <sys/stat.h>
  685.   
  686.   #ifdef    RCSIDENT
  687.   static char rcsid[] = "$Header: gtext.c,v 1.7 87/07/01 12:39:33 paul Locked $";
  688. ***************
  689. *** 17,24 ****
  690. --- 19,31 ----
  691.    *    modified again:    rbe 12 nov 81    fix to version 7 and general shtuff
  692.    *    modified a third time to add insert-text for user
  693.    *        Ray Essick    December 1981
  694. +  *    modified to add non-portable way of appending a signature file.
  695. +  *        Rich $alz    July, 1985
  696. +  *    did signatures the "right" way (better, at least) - LOCAL flag
  697. +  *        Rich $alz    August, 1985
  698.    */
  699.   
  700. + extern char hissig[];
  701.   long    gettext (io, where, preface, editflag)
  702.   struct io_f *io;
  703.   struct daddr_f *where;                    /* where we left it */
  704. ***************
  705. *** 29,34 ****
  706. --- 36,42 ----
  707.       register int    c;
  708.       long    count;
  709.       char    fn[20];                    /* scratch file name */
  710. +     struct stat    sbuf;
  711.   
  712.       sprintf (fn, "/tmp/nf%d", getpid ());
  713.       x ((scr = fopen (fn, "w")) == NULL, "gettext: create scratch");
  714. ***************
  715. *** 69,74 ****
  716. --- 77,106 ----
  717.       {
  718.       unlink (fn);                    /* might just be protections */
  719.       return ((long) 0);
  720. +     }
  721. +     (void) fstat (fileno (scr), &sbuf);
  722. +     if (sbuf.st_size > (off_t) 0 && hissig[0]
  723. +      && io -> descr.d_stat & NETWRKD && !(io -> descr.d_stat & LOCAL))
  724. +     {
  725. +     c = askyn ("Add signature (y/n): ");
  726. +     printf ("\r                      \r");
  727. +     if (c == 'y')
  728. +     {
  729. +         FILE * siggy;
  730. +         if ((siggy = fopen (hissig, "r")) == NULL)
  731. +         printf ("Can't find %s", hissig);
  732. +         else
  733. +         {
  734. +         /* Flop to append mode, append, flip back to read */
  735. +         freopen (fn, "a", scr);
  736. +         while ((c = getc (siggy)) != EOF)
  737. +             putc (c, scr);
  738. +         fclose (siggy);
  739. +         freopen (fn, "r", scr);
  740. +         }
  741. +     }
  742.       }
  743.   
  744.       count = pagein (io, scr, where);            /* move text in */
  745. *** /tmp/,RCSt1020354    Wed Jul  1 13:38:35 1987
  746. --- index.c    Wed Jul  1 12:55:09 1987
  747. ***************
  748. *** 20,27 ****
  749. --- 20,33 ----
  750.    *
  751.    *    Original Coding:    Rob Kolstad    Winter 1980
  752.    *    modifications:        Ray Essick    December 1981
  753. +  *    added MODERATED code:    Rich $alz    August 1985
  754. +  *    added LOCAL flag:    Rich $alz    August 1985
  755.    */
  756.   
  757. + static char YES[] = "YES";
  758. + static char NO[] = "NO ";
  759. + #define YorN(c)        ((c) != 0 ? YES : NO)
  760.   indx (io, firstdis, lastdis, respnum)
  761.   struct io_f *io;
  762.   int    *firstdis,
  763. ***************
  764. *** 58,66 ****
  765.   
  766.           case 'W':                     /* this too shall write a note */
  767.           case 'w':                     /* write a note */
  768. !         return addnote (io, NULL, "Edit Note text:", "Note Title: ", NULL, EDIT);
  769. !                             /* do it */
  770.   
  771.           case 'B':                     /* bitch, bitch, bitch */
  772.           if (init (&io2, GRIPES) < 0)        /* no gripe file */
  773.           {
  774. --- 64,77 ----
  775.   
  776.           case 'W':                     /* this too shall write a note */
  777.           case 'w':                     /* write a note */
  778. !         if ( ! (io -> descr.d_stat & MODERATED ) )
  779. !             return addnote (io, NULL, "Edit Note text:", "Note Title: ", NULL, EDIT);
  780. !         if (askyn ("Moderated; send mail to moderator? ") == 'y')
  781. !             mailit(io, (struct daddr_f *)0, (struct auth_f *)0,
  782. !             (struct when_f *)0, (char *)0, MODERATED, 0);
  783. !         return (-1);
  784.   
  785.           case 'B':                     /* bitch, bitch, bitch */
  786.           if (init (&io2, GRIPES) < 0)        /* no gripe file */
  787.           {
  788. ***************
  789. *** 167,175 ****
  790.           else
  791.           {
  792.               at (0, PROMPTMSGX);
  793. !             printf (" Anonymous: %s   Networked: %s",
  794. !                 (io -> descr.d_stat & ANONOK) ? "YES" : "NO",
  795. !                 (io -> descr.d_stat & NETWRKD) ? "YES" : "NO");
  796.               continue;
  797.           }
  798.   
  799. --- 178,190 ----
  800.           else
  801.           {
  802.               at (0, PROMPTMSGX);
  803. !             printf (
  804. !          "Anonymous: %s   Networked: %s   Moderated: %s   Local: %s",
  805. !                 YorN (io -> descr.d_stat & ANONOK),
  806. !                 YorN (io -> descr.d_stat & NETWRKD),
  807. !                 YorN (io -> descr.d_stat & MODERATED),
  808. !                 YorN (io -> descr.d_stat & LOCAL));
  809.               continue;
  810.           }
  811.   
  812. *** /tmp/,RCSt1020366    Wed Jul  1 13:38:40 1987
  813. --- mailit.c    Wed Jul  1 12:55:11 1987
  814. ***************
  815. *** 20,25 ****
  816. --- 20,27 ----
  817.    *    modified:    Ray Essick    December 1981.
  818.    *    modified again:    Thanks to Malcolm Slaney of Purdue EE dept.
  819.    *        added the SUPERMAILER processing. May 25, 1982
  820. +  *    added code to handle the MODERATED flag.
  821. +  *        rich $alz, mirror systems, august 19, 1985
  822.    *
  823.    */
  824.   
  825. ***************
  826. *** 38,51 ****
  827.       char    fn[20];                    /* hold scratch file name */
  828.       int     f;
  829.       char   *p;
  830. -     int     i;
  831.       FILE * txtfile;
  832.   #ifdef    SUPERMAILER
  833.       char    subject[TITLEN + 20];            /* mailer subject */
  834.   #endif
  835.   
  836. !     if (toauth)
  837.       {
  838.       if (strcmp (author -> aname, "Anonymous") == 0)
  839.       {
  840.           printf ("Can't send to Anonymous\n");
  841. --- 40,70 ----
  842.       char    fn[20];                    /* hold scratch file name */
  843.       int     f;
  844.       char   *p;
  845.       FILE * txtfile;
  846.   #ifdef    SUPERMAILER
  847.       char    subject[TITLEN + 20];            /* mailer subject */
  848.   #endif
  849.   
  850. !     if (toauth == MODERATED)
  851.       {
  852. +     f = 1;
  853. +     toauth = 0;
  854. +     }
  855. +     else
  856. +     f = 0;
  857. +     if (f && io -> descr.d_stat & MODERATED)
  858. +     {
  859. +     if (modaddress (io -> nf, whoto) == 1)
  860. +     {
  861. +         at (0, 1);
  862. +         printf ("\nComplain to a guru; can't find moderator!\007\n");
  863. +         fflush (stdout);
  864. +         sleep (1);
  865. +         return (-1);                /* no letter sent */
  866. +     }
  867. +     }
  868. +     else if (toauth)
  869. +     {
  870.       if (strcmp (author -> aname, "Anonymous") == 0)
  871.       {
  872.           printf ("Can't send to Anonymous\n");
  873. ***************
  874. *** 53,62 ****
  875.           sleep (2);
  876.           return (-1);
  877.       }
  878. -     }
  879. -     if (toauth)
  880. -     {
  881.       if (strcmp (System, author -> asystem) != 0)
  882.       {
  883.   #ifdef    USERHOST
  884. --- 72,77 ----
  885. ***************
  886. *** 189,192 ****
  887. --- 204,246 ----
  888.   #endif    SUPERMAILER
  889.   
  890.       return 0;
  891. + }
  892. + modaddress (notesname, address)
  893. +     char *notesname;
  894. +     char *address;
  895. + {
  896. +     char buff[WDLEN];
  897. +     register FILE *mods;
  898. +     register char *p;
  899. +     sprintf (buff, "%s/%s/moderators", MSTDIR, UTILITY);
  900. +     if ((mods = fopen (buff, "r")) == NULL)
  901. +     {
  902. +     printf ("Can't open moderators file!\n");
  903. +     return 1;
  904. +     }
  905. +     while (fgets ( buff, sizeof buff, mods))
  906. +     {
  907. +     /* read lines of the form <name><whitespace>path; blanks and lines */
  908. +     /* starting with "#" are comments. */
  909. +     if (buff[0] == '\0' || buff[0] == '#'
  910. +      || (((p=index(buff, ' ')) == NULL) && (p=index(buff, '\t')) == NULL))
  911. +         continue;
  912. +     *p++ = '\0';                    /* split into halves */
  913. +     while (*p == ' ' || *p == '\t')
  914. +         p++;                    /* skip whitespace */
  915. +     if (!strcmp (notesname, buff))
  916. +     {
  917. +         strcpy (address, p);
  918. +         address[strlen(address) - 1] = '\0';    /* kill the \n */
  919. +         fclose (mods);
  920. +         return 0;
  921. +     }
  922. +     }
  923. +     fclose (mods);
  924. +     return 1;
  925.   }
  926. *** /tmp/,RCSt1020372    Wed Jul  1 13:38:45 1987
  927. --- main.c    Wed Jul  1 12:55:13 1987
  928. ***************
  929. *** 16,27 ****
  930.    *    Original author: Rob Kolstad    Winter, 1980.
  931.    *    Modifications:    Ray Essick    June, 1981.
  932.    *    Modified more:    Ray Essick    May, 1982.
  933.    *
  934. -  *
  935.    */
  936.   
  937.   
  938.   static int  seqon = NOSEQ;                /* sequencer mode */
  939.   
  940.   main (argc, argv)
  941.   char  **argv;
  942. --- 16,29 ----
  943.    *    Original author: Rob Kolstad    Winter, 1980.
  944.    *    Modifications:    Ray Essick    June, 1981.
  945.    *    Modified more:    Ray Essick    May, 1982.
  946. +  *    modified:    Rich $alz    July, 1985
  947. +  *        To add the hissig (signature file) variable.
  948.    *
  949.    */
  950.   
  951.   
  952.   static int  seqon = NOSEQ;                /* sequencer mode */
  953. + char hissig[WDLEN];                    /* signature file */
  954.   
  955.   main (argc, argv)
  956.   char  **argv;
  957. ***************
  958. *** 60,65 ****
  959. --- 62,69 ----
  960.   /*
  961.    *    grab some variables from the environment
  962.    */
  963. +     if ((p = getenv ("NFSIG")) != 0 && access (p, 04) >= 0)
  964. +     strcpy(hissig, p);                /* his signature file */
  965.       if ((p = getenv ("SHELL")) != 0)
  966.       hisshell = p;                    /* his shell */
  967.       if ((p = getenv ("NFED")) != 0)
  968. *** /tmp/,RCSt1020383    Wed Jul  1 13:38:49 1987
  969. --- nfadmin.c    Wed Jul  1 12:58:15 1987
  970. ***************
  971. *** 21,33 ****
  972.       int     argn;
  973.       struct nflist_f *nfptr;
  974.       int        change, newexp;
  975. !     int        newanon, newopen, newnet, newarch;
  976.       int        newwset, newdir, newact, newlen;
  977.   
  978.       startup (argc, argv);                /* common init code */
  979.   
  980.       newdir = newact = newwset = newlen = newexp = -2;
  981. !     newanon = newopen = newnet = newarch = change = 0;
  982.       for ( argc--, argv++; argc > 0 && argv[0][0] == '-'; argc--, argv++)
  983.       {
  984.       switch(argv[0][1])
  985. --- 21,33 ----
  986.       int     argn;
  987.       struct nflist_f *nfptr;
  988.       int        change, newexp;
  989. !     int        newanon, newopen, newnet, newarch, newlocal, newmod;
  990.       int        newwset, newdir, newact, newlen;
  991.   
  992.       startup (argc, argv);                /* common init code */
  993.   
  994.       newdir = newact = newwset = newlen = newexp = -2;
  995. !     newanon = newopen = newnet = newarch = newlocal = newmod = change = 0;
  996.       for ( argc--, argv++; argc > 0 && argv[0][0] == '-'; argc--, argv++)
  997.       {
  998.       switch(argv[0][1])
  999. ***************
  1000. *** 48,53 ****
  1001. --- 48,61 ----
  1002.           change = 1;
  1003.           newopen = newval(argv[0][2]);
  1004.           break;
  1005. +     case 'L':
  1006. +         change = 1;
  1007. +         newlocal = newval(argv[0][2]);
  1008. +         break;
  1009. +     case 'M':
  1010. +         change = 1;
  1011. +         newmod = newval(argv[0][2]);
  1012. +         break;
  1013.       case 'A':
  1014.           change = 1;
  1015.           newarch = newval(argv[0][2]);
  1016. ***************
  1017. *** 151,156 ****
  1018. --- 159,174 ----
  1019.               io.descr.d_stat |= OPEN;
  1020.           else
  1021.               io.descr.d_stat &= ~OPEN;
  1022. +         if (newlocal)
  1023. +         if (newlocal > 0)
  1024. +             io.descr.d_stat |= LOCAL;
  1025. +         else
  1026. +             io.descr.d_stat &= ~LOCAL;
  1027. +         if (newmod)
  1028. +         if (newmod > 0)
  1029. +             io.descr.d_stat |= MODERATED;
  1030. +         else
  1031. +             io.descr.d_stat &= ~MODERATED;
  1032.           if (newarch)
  1033.           if (newarch > 0)
  1034.               io.descr.d_stat |= ISARCH;
  1035. ***************
  1036. *** 210,217 ****
  1037.   
  1038.       if (!flag)
  1039.       {
  1040. !         printf("notesfile title NetW Open Anon Arch   WSet Arch. Keep DirM     #         Max\n");
  1041. !         printf("                -------status------   Size Time  Actn Stat   Notes       Size\n");
  1042.       }
  1043.       flag = 1;
  1044.       switch(d->d_dmesgstat)
  1045. --- 228,235 ----
  1046.   
  1047.       if (!flag)
  1048.       {
  1049. !         printf("    notesfile title     NetW Open Anon Arch Locl Mod    WSet Arch. Keep DirM     #         Max\n");
  1050. !         printf("                        ------------status-----------   Size Time  Actn Stat   Notes       Size\n");
  1051.       }
  1052.       flag = 1;
  1053.       switch(d->d_dmesgstat)
  1054. ***************
  1055. *** 247,255 ****
  1056.       else    sprintf(archtime, "%4d ", d->d_archtime);
  1057.   
  1058.   
  1059. !     printf("%14.14s: %s %s %s %s  %5d %s %s %s   %5d%12d\n",
  1060.           d->d_title, yes(d->d_stat & NETWRKD), yes(d->d_stat & OPEN),
  1061.           yes(d->d_stat & ANONOK), yes(d->d_stat & ISARCH), 
  1062.           d->d_workset, archtime, archkeep, msgstat, d->d_nnote, 
  1063.           d->d_longnote);
  1064.   
  1065. --- 265,274 ----
  1066.       else    sprintf(archtime, "%4d ", d->d_archtime);
  1067.   
  1068.   
  1069. !     printf("%22.22s: %s %s %s %s %s %s  %5d %s %s %s   %5d%12d\n",
  1070.           d->d_title, yes(d->d_stat & NETWRKD), yes(d->d_stat & OPEN),
  1071.           yes(d->d_stat & ANONOK), yes(d->d_stat & ISARCH), 
  1072. +         yes(d->d_stat & LOCAL), yes(d->d_stat & MODERATED), 
  1073.           d->d_workset, archtime, archkeep, msgstat, d->d_nnote, 
  1074.           d->d_longnote);
  1075.   
  1076. *** /tmp/,RCSt1020391    Wed Jul  1 13:38:57 1987
  1077. --- readem.c    Wed Jul  1 12:55:20 1987
  1078. ***************
  1079. *** 19,26 ****
  1080. --- 19,32 ----
  1081.   *    modified    : ray essick may 22, 1981
  1082.   *    modified (again): Ray Essick December 1981
  1083.   *    modified (more):  Ray Essick, February 1982
  1084. + *    added MODERATED:  Rich $alz, August 1985
  1085. + *    added LOCAL and YorN: Rich $alz, August 1985
  1086.   *
  1087.   */
  1088. + static char YES[] = "YES";
  1089. + static char NO[] = "NO ";
  1090. + #define YorN(c)        ((c) != 0 ? YES : NO)
  1091.   readem (io, readnum, firstdis, resp)
  1092.   struct io_f *io;
  1093.   int    *firstdis;
  1094. ***************
  1095. *** 333,347 ****
  1096.           toauth = 0;
  1097.           wtext = 1;                /* to others with text */
  1098.           goto sendmail;
  1099.           case 'P': 
  1100. -         toauth = 1;
  1101. -         wtext = 1;                /* to author with text */
  1102. -         goto sendmail;
  1103.           case 'p': 
  1104.           toauth = 1;
  1105. !         wtext = 0;                /* to author, no text */
  1106. !         goto sendmail;
  1107.       sendmail:                     /* jump to here once set mail parms */
  1108.           if (resp)
  1109.           {
  1110. --- 339,358 ----
  1111.           toauth = 0;
  1112.           wtext = 1;                /* to others with text */
  1113.           goto sendmail;
  1114. +         /* mail to author, possibly with text. */
  1115.           case 'P': 
  1116.           case 'p': 
  1117. + #ifdef NO_Pp_FOR_MODERATED
  1118. +         /* some people may want this */
  1119. +         if (io -> d_descr.d_stat & MODERATED)
  1120. +         {
  1121. +             at (0, 10);
  1122. +             printf ("Moderated; use 'm' or 'M' command\n");
  1123. +             continue;
  1124. +         }
  1125. + #endif NO_Pp_FOR_MODERATED
  1126.           toauth = 1;
  1127. !         wtext = c == 'P';            /* to author with text */
  1128.       sendmail:                     /* jump to here once set mail parms */
  1129.           if (resp)
  1130.           {
  1131. ***************
  1132. *** 454,462 ****
  1133.           if (allow (io, DRCTOK) == 0)
  1134.           {                    /* tell him what's up */
  1135.               at (0, PROMPTMSGX);
  1136. !             printf (" Anonymous: %s   Networked: %s",
  1137. !                 (io -> descr.d_stat & ANONOK) ? "YES" : "NO",
  1138. !                 (io -> descr.d_stat & NETWRKD) ? "YES" : "NO");
  1139.               replot = 0;                /* leave on screen */
  1140.               goto showit;
  1141.           }
  1142. --- 465,476 ----
  1143.           if (allow (io, DRCTOK) == 0)
  1144.           {                    /* tell him what's up */
  1145.               at (0, PROMPTMSGX);
  1146. !             printf (
  1147. !          "Anonymous: %s   Networked: %s   Moderated: %s   Local: %s",
  1148. !                 YorN (io -> descr.d_stat & ANONOK),
  1149. !                 YorN (io -> descr.d_stat & NETWRKD),
  1150. !                 YorN (io -> descr.d_stat & MODERATED),
  1151. !                 YorN (io -> descr.d_stat & LOCAL));
  1152.               replot = 0;                /* leave on screen */
  1153.               goto showit;
  1154.           }
  1155. ***************
  1156. *** 528,533 ****
  1157. --- 542,555 ----
  1158.           case 'W':                     /* write a response with the text */
  1159.           case 'w':                     /* let him write a response */
  1160.           getdscr (io, &io -> descr);        /* get up to date */
  1161. +         if (io -> descr.d_stat & MODERATED)
  1162. +         {
  1163. +             wtext = c == 'W';
  1164. +             toauth = MODERATED;        /* toauth distinguishes m/w */
  1165. +             goto sendmail;
  1166. +         }
  1167.           if (allow (io, RESPOK) == 0)
  1168.           {
  1169.               at (0, PROMPTMSGX);
  1170. *** /tmp/,RCSt1020405    Wed Jul  1 13:39:16 1987
  1171. --- structs.h    Wed Jul  1 12:55:22 1987
  1172. ***************
  1173. *** 105,110 ****
  1174. --- 105,112 ----
  1175.   #define        WRITONLY   0100                /* writeonly access when written */
  1176.   #define        ORPHND       0200                /* foster parent */
  1177.   #define        ISARCH       0400                /* is an archive */
  1178. + #define        MODERATED 01000                /* mail to moderator */
  1179. + #define        LOCAL     02000                /* no signature */
  1180.   
  1181.   /*    change these only after modifying the table in access.c        */
  1182.   #define        READOK    01                /* allow user to read */
  1183. SHAR_EOF
  1184. fi
  1185. if test -f 'moderators'
  1186. then
  1187.     echo shar: "will not over-write existing file 'moderators'"
  1188. else
  1189. cat << \SHAR_EOF > 'moderators'
  1190. # Local lists
  1191. #
  1192. cso.sysnet            sysnet@uxc.cso.uiuc.edu
  1193. cso.network            network@uxc.cso.uiuc.edu
  1194. cso.beer            beer@uiucvmd
  1195. beer                beer@uiucvmd
  1196. #
  1197. # Mailing lists
  1198. #
  1199. ai-ed                ai-ed@sumex.stanford.edu
  1200. aidigest            AIList@stripe.sri.com
  1201. bind                bind@ucbarpa.Berkeley.EDU
  1202. brl-cad                cad@brl.arpa
  1203. cs-lex                cs-lex@red.rutgers.edu
  1204. csnetforum            csnet-forum@sh.cs.net
  1205. firearms            firearms@seismo.css.gov
  1206. gwmon                gwmon@sh.cs.net
  1207. hyper-ip            hy-people@ames-nasb.arpa
  1208. ineng-tf            ineng-tf@venera.isi.edu
  1209. info-apple            info-apple@brl.arpa
  1210. info-cpm            info-cpm@amsaa.arpa
  1211. info-gcc            info-gcc@prep.ai.mit.edu
  1212. info-isi            info-isi@lownlab.harvard.edu
  1213. info-law            info-law@brl.arpa
  1214. info-postscript            info-postscript@sushi.stanford.edu
  1215. info-proteon            info-proteon@uxc.cso.uiuc.edu
  1216. info-sequent            info-sequent@j.cc.purdue.edu
  1217. mh-users            mh-users@ics.uci.edu
  1218. mhs                arpa-mhs@nrtc.northrop.com
  1219. nfsnet                nsfnet@SH.CS.NET
  1220. nsfnet-routing            nsfnet-routing@mcr.umich.edu
  1221. parsym                parsym@sumex.stanford.edu
  1222. prologdigest            prolog@score.stanford.edu
  1223. pyramid                info-pyramid@mimsy.umd.edu
  1224. sec-list            sec-request@isis.uucp
  1225. security            security@rutgers.edu
  1226. supercomputer            supercomputer@nyu.arpa
  1227. tcp-ip                tcp-ip@sri-nic.arpa
  1228. texhax                TeXhax@score.stanford.edu
  1229. theory                theory@wisc.rsch.edu
  1230. tr-list                trlist@smu.csnet
  1231. unix-tex            unix-tex@ward.cs.washington.edu
  1232. utah-toolkit            toolkit@cs.utah.edu
  1233. video-tech            video-tech@simtel20.arpa
  1234. #
  1235. # Net-wide lists
  1236. #
  1237. comp.ai.digest             ailist@stripe.sri.com
  1238. comp.binaries.amiga        amiga-binaries-request@j.cc.purdue.edu
  1239. comp.binaries.atari.st        atari-sources@imagen.uucp
  1240. comp.binaries.mac         macintosh@felix.uucp
  1241. comp.bugs.4bsd.ucb-fixes    ucb-fixes@okeeffe.berkeley.edu
  1242. comp.compilers             compilers@ima.uucp
  1243. comp.dcom.telecom         telecom@xx.lcs.mit.edu
  1244. comp.doc             archive@brl.arpa
  1245. comp.doc.techreports         trlist@smu.uucp
  1246. comp.graphics.digest         info-graphics@ads.arpa
  1247. comp.laser-printers        laser-lovers@brillig.umd.edu
  1248. comp.mail.elm            elm-info@hplabs.hp.com
  1249. comp.mail.maps             postmap@cbosgd.att.com
  1250. comp.newprod             newprod@cbosgd.att.com
  1251. comp.org.fidonet         pozar@hoptoad.uucp
  1252. comp.os.os9             os9@cbosgd.att.com
  1253. comp.os.research         mod-os@sdcsvax.ucsd.edu
  1254. comp.protocols.kermit         info-kermit@cu20b.columbia.edu
  1255. comp.risks             risks@csl.sri.com
  1256. comp.society             comp-soc@hplabs.hp.com
  1257. comp.sources.amiga        amiga-sources-request@j.cc.purdue.edu
  1258. comp.sources.atari.st        atari-sources@imagen.uucp
  1259. comp.sources.games         games@tekred.tek.com
  1260. comp.sources.mac         macintosh@felix.uucp
  1261. comp.sources.misc        sources-misc@ncoast.uucp
  1262. comp.sources.unix         sources@uunet.uu.net
  1263. comp.std.c             std-c@cbosgd.att.com
  1264. comp.std.misc             mark@cbosgd.att.com
  1265. comp.std.mumps             std-mumps@plus5.com
  1266. comp.std.unix            std-unix@sally.utexas.edu
  1267. comp.sys.ibm.pc.digest         info-ibmpc@c.isi.edu
  1268. comp.sys.mac.digest         info-mac@sumex-aim.stanford.edu
  1269. comp.sys.masscomp         masscomp@soma.uucp
  1270. comp.sys.m68k.pc        info-68k@ucbvax.berkeley.edu
  1271. comp.sys.sequent        info-sequent@j.cc.purdue.edu
  1272. comp.sys.sun             sun-spots@rice.edu
  1273. comp.sys.workstations        works@red.rutgers.edu
  1274. comp.text.desktop        desktop@plaid.sun.com
  1275. comp.unix             modunix@cbosgd.att.com
  1276. misc.handicap            handicap@bunker.uucp
  1277. misc.psi             mod-psi@ulowell.edu
  1278. news.announce.conferences    conferences@hplabs.hp.com
  1279. news.announce.important     announce@cbosgd.att.com
  1280. news.announce.newusers         usenet@gatech.edu
  1281. news.lists            usenet@gatech.edu,rick@seismo.css.gov
  1282. rec.arts.movies.reviews        movies@mtgzy.att.com
  1283. rec.food.recipes         mod-recipes@decwrl.dec.com
  1284. rec.guns             jkh@opal.berkeley.edu
  1285. rec.mag.otherrealms         fanzine@plaid.sun.com
  1286. rec.music.gaffa         gaffa-post@eddie.mit.edu
  1287. soc.human-nets             human-nets@red.rutgers.edu
  1288. soc.politics            poli-sci@rutgers.edu
  1289. soc.politics.arms-d        arms-d@xx.lcs.mit.edu
  1290. soc.religion.christian         christian@topaz.rutgers.edu
  1291. SHAR_EOF
  1292. fi
  1293. exit 0
  1294. #    End of shell archive
  1295. -- 
  1296.  
  1297. Rich $alz            "Anger is an energy"
  1298. Cronus Project, BBN Labs    rsalz@bbn.com
  1299. Moderator, comp.sources.unix    sources@uunet.uu.net
  1300.